// numeric Demo
// Created by Administrator on 2025/6/26.
// 用于对容器中元素的数值进行计算

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

/**
 * 容器元素总和
 */
void arraySumFunc() {
    vector<int> vec = {1, 2, 3, 4, 5};
    const int sumValue = accumulate(vec.begin(), vec.end(), 0);
    cout << "vec 的元素总和为：" << sumValue << endl;
}

/**
 * 乘积总和
 */
void innerProductFunc() {
    vector<int> vec1 = {1, 2, 3, 4};
    vector<int> vec2 = {1, 2, 3, 4};

    // 用 vec1 中的元素乘以 vec2 中对应的元素，并求和
    // vec1中的元素              1    2   3   4
    // 乘法运算符                *    *   *   *
    // vec2中的元素              1    2   3   4
    // 进行乘法后的结果值并相加     1  + 4 + 9 + 16 = 30
    const int productSum = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    cout << "vec1 和 vec2 乘积总和为：" << productSum << endl; // 30
}

/**
 * 计算容器中的元素部分求和
 */
void partialSumFunc() {
    vector<int> vec = {1, 2, 3, 4, 5};
    vector<int> result(vec.size());
    // 拿容器中的第一个元素和第二个元素相加，再拿相加的和与第三个元素相加，以此类推
    // （vec[0] + vec[1]） = 3, ( 3 + vec[2]) = 6 , (6 + vec[3]) = 10, (10 + vec[4]) = 15
    partial_sum(vec.begin(), vec.end(), result.begin());
    cout << "result values :\t";
    for (int i: result) {
        cout << i << "\t";
    }
    cout << endl;
}

/**
 * 计算容器相邻元素之间的差
 */
void adjacentDifferenceFunc() {
    vector<int> vec = {1, 5, 8, 10};
    vector<int> results(vec.size());
    adjacent_difference(vec.begin(), vec.end(), results.begin());

    //  1       4       3       2
    cout << "results values :\t";
    for (int i: results) {
        cout << i << "\t";
    }
    cout << endl;
}

/**
 * 两个数值的最大公约数和最小公倍数
 */
void gcdAndLcmFunc() {
    constexpr int a = 48;
    constexpr int b = 18;
    constexpr int gcdValue = gcd(a, b);
    cout << "最大公约数为：" << gcdValue << endl;

    constexpr int lcmValue = lcm(a, b);
    cout << "最小公倍数为：" << lcmValue << endl;
}

/**
 * 递增填充容器
 */
void iotaFunc() {
    vector<int> vec(5);

    // 从 5 开始递增填充。 5 6 7 8 9
    iota(vec.begin(), vec.end(), 5);
    cout << "vec values :\t";
    for (const int i: vec) {
        cout << i << "\t";
    }
    cout << endl;
}

/**
 * 查找最小值和最大值
 */
void minAndMaxValueFunc() {
    vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    const int minValue = *min_element(vec.begin(), vec.end());
    const int maxValue = *max_element(vec.begin(), vec.end());

    cout << "min value:" << minValue << endl;
    cout << "max value:" << maxValue << endl;
}


int main(int argc, char *argv[]) {
    // arraySumFunc();
    // innerProductFunc();
    // partialSumFunc();
    // adjacentDifferenceFunc();
    // gcdAndLcmFunc();
    // iotaFunc();
    // minAndMaxValueFunc();
}
